In [1]:
import lasio
import os

las = lasio.read(os.path.join("..", "tests", "examples", "6038187_v1.2_short.las"))

The information in a LAS file's header is all parsed and available through the sections of the header.

All the sections are in the dictionary las.sections.


In [2]:
for name, section in las.sections.items():
    print((name, type(section)))


('Version', <class 'lasio.las_items.SectionItems'>)
('Well', <class 'lasio.las_items.SectionItems'>)
('Curves', <class 'lasio.las_items.SectionItems'>)
('Parameter', <class 'lasio.las_items.SectionItems'>)
('Other', <class 'str'>)

These standard section names are hard-coded as attributes, but if your LAS file has non-standard ones they will be in here too.

Only the standard sections are parsed in the LAS format, as a SectionItems object. Others will be left as text, like ~Other.


In [3]:
las.version


Out[3]:
[HeaderItem(mnemonic=VERS, unit=, value=2.0, descr=CWLS LOG ASCII STANDARD - ...),
 HeaderItem(mnemonic=WRAP, unit=, value=NO, descr=ONE LINE PER DEPTH STEP)]

You can use this like a list... or like a dictionary, using the mnemonic= attribute as a key to the dictionary.

for example:


In [4]:
for item in las.version:
    print(item)


HeaderItem(mnemonic=VERS, unit=, value=2.0, descr=CWLS LOG ASCII STANDARD - ...)
HeaderItem(mnemonic=WRAP, unit=, value=NO, descr=ONE LINE PER DEPTH STEP)

Or we can pull out an item using the section like a dictionary:


In [5]:
las.version['VERS']


Out[5]:
HeaderItem(mnemonic=VERS, unit=, value=2.0, descr=CWLS LOG ASCII STANDARD - ...)

Or even as an attribute, if the mnemonic allows it:


In [6]:
las.version.VERS


Out[6]:
HeaderItem(mnemonic=VERS, unit=, value=2.0, descr=CWLS LOG ASCII STANDARD - ...)

Each HeaderItem is also itself an attribute dictionary - very easy to get at each property either as an item (dict style) or an attribute:


In [7]:
v = las.version.VERS
v.descr


Out[7]:
'CWLS LOG ASCII STANDARD - VERSION 2.0'

In [8]:
v.value


Out[8]:
2.0

Moving on to the standard ~Well section of a LAS header.

Let's say we'd like to edit a property. We can do it easily by directly assigning the values:


In [9]:
las.well.CTRY


Out[9]:
HeaderItem(mnemonic=CTRY, unit=, value=, descr=)

In [10]:
las.well.CTRY.descr = 'Australia'
las.well.CTRY


Out[10]:
HeaderItem(mnemonic=CTRY, unit=, value=, descr=Australia)

Now let's have a look at the curves section.


In [11]:
las.curves


Out[11]:
[CurveItem(mnemonic=DEPT, unit=M, value=, descr=DEPTH, original_mnemonic=DEPT, data.shape=(121,)),
 CurveItem(mnemonic=CALI, unit=MM, value=, descr=CALI, original_mnemonic=CALI, data.shape=(121,)),
 CurveItem(mnemonic=DFAR, unit=G/CM3, value=, descr=DFAR, original_mnemonic=DFAR, data.shape=(121,)),
 CurveItem(mnemonic=DNEAR, unit=G/CM3, value=, descr=DNEAR, original_mnemonic=DNEAR, data.shape=(121,)),
 CurveItem(mnemonic=GAMN, unit=GAPI, value=, descr=GAMN, original_mnemonic=GAMN, data.shape=(121,)),
 CurveItem(mnemonic=NEUT, unit=CPS, value=, descr=NEUT, original_mnemonic=NEUT, data.shape=(121,)),
 CurveItem(mnemonic=PR, unit=OHM/M, value=, descr=PR, original_mnemonic=PR, data.shape=(121,)),
 CurveItem(mnemonic=SP, unit=MV, value=, descr=SP, original_mnemonic=SP, data.shape=(121,)),
 CurveItem(mnemonic=COND, unit=MS/M, value=, descr=COND, original_mnemonic=COND, data.shape=(121,))]

CurveItems are very similar. The only difference is that they have an additional data= attribute.

Notice the units for PR are incorrect - we can fix that:


In [12]:
las.curves.PR.unit = "ohmm"

In [13]:
las.curves["PR"]


Out[13]:
CurveItem(mnemonic=PR, unit=ohmm, value=, descr=PR, original_mnemonic=PR, data.shape=(121,))

And finally the standard ~Parameter section:


In [14]:
las.params         # las.sections["params"] would also work


Out[14]:
[HeaderItem(mnemonic=BS, unit=, value=216 mm, descr=BS),
 HeaderItem(mnemonic=JOBN, unit=, value=, descr=JOBN),
 HeaderItem(mnemonic=WPMT, unit=, value=, descr=WPMT),
 HeaderItem(mnemonic=AGL, unit=, value=, descr=AGL),
 HeaderItem(mnemonic=PURP, unit=, value=Cased hole stratigraphy, descr=PURP),
 HeaderItem(mnemonic=X, unit=, value=560160, descr=X),
 HeaderItem(mnemonic=CSGL, unit=, value=0 m - 135 m, descr=CSGL),
 HeaderItem(mnemonic=UNIT, unit=, value=, descr=UNIT),
 HeaderItem(mnemonic=Y, unit=, value=6686430, descr=Y),
 HeaderItem(mnemonic=TDL, unit=, value=135.2 m, descr=TDL),
 HeaderItem(mnemonic=PROD, unit=, value=, descr=PROD),
 HeaderItem(mnemonic=MUD, unit=, value=Water, descr=MUD),
 HeaderItem(mnemonic=CSGS, unit=, value=100 mm, descr=CSGS),
 HeaderItem(mnemonic=ENG, unit=, value=, descr=ENG),
 HeaderItem(mnemonic=STEP, unit=, value=5 cm, descr=STEP),
 HeaderItem(mnemonic=FLUIDLEVEL, unit=, value=54 m, descr=FluidLevel),
 HeaderItem(mnemonic=CSGT, unit=, value=PVC, descr=CSGT),
 HeaderItem(mnemonic=WIT, unit=, value=, descr=WIT),
 HeaderItem(mnemonic=EREF, unit=, value=, descr=EREF),
 HeaderItem(mnemonic=PROJ, unit=, value=, descr=PROJ),
 HeaderItem(mnemonic=ZONE, unit=, value=53J, descr=ZONE),
 HeaderItem(mnemonic=DREF, unit=, value=GL, descr=DREF),
 HeaderItem(mnemonic=TDD, unit=, value=136 m, descr=TDD)]

If you'd prefer to see a section as a dictionary with the value property, you can with the dictview() method:


In [15]:
las.params.dictview()


Out[15]:
{'BS': '216 mm',
 'JOBN': '',
 'WPMT': '',
 'AGL': '',
 'PURP': 'Cased hole stratigraphy',
 'X': 560160,
 'CSGL': '0 m - 135 m',
 'UNIT': '',
 'Y': 6686430,
 'TDL': '135.2 m',
 'PROD': '',
 'MUD': 'Water',
 'CSGS': '100 mm',
 'ENG': '',
 'STEP': '5 cm',
 'FLUIDLEVEL': '54 m',
 'CSGT': 'PVC',
 'WIT': '',
 'EREF': '',
 'PROJ': '',
 'ZONE': '53J',
 'DREF': 'GL',
 'TDD': '136 m'}

In [ ]:


In [ ]: